package me.twoday.library.mine.common;

import me.twoday.library.mine.common.base.BaseApplication;
import android.util.Log;


/**
 * 로깅을 위한 래핑 클래스. 기존의 경우 싱글턴 방식을 사용하였지만
 * 다양한곳에서의 로깅에 대응하기 어려워 단일 인스턴스 방식으로 변경
 * 
 * 우람이형이 만든 코드를 재사용 시작합니다.
 * 
 * DEBUG(1) < INFO(2) < WARNING(3) < ERROR(4)
 * 
 * @author 박우람, 김학성 
 * @since 2010.02.14
 */
public class LoggerUtil
{
	private static final int DEBUG = 1;
	private static final int INFO = 2;
	private static final int WARNING = 3;
	private static final int ERROR = 4;
	
	private String mTag;
	private int mLevel = 0;
	
	private LoggerUtil(String tag)
	{
		this.mTag = tag;
	}
	
	/**
	 * 태그를 설정하여 인스턴스를 반환한다.
	 * 
	 * @param tag 로깅용 클래스명
	 * @return LoggerUtil 객체
	 */
	public static LoggerUtil getInstance(String tag)
	{
		return new LoggerUtil(tag);
	}

	/**
	 * DEBUG 로그를 남긴다.
	 * 
	 * @param message 로그 메시지
	 */
	public void d(String message)
	{
		if(checkLevel(DEBUG))
		{
			Log.d(mTag, message);
		}
	}
	
	/**
	 * INFO 로그를 남긴다.
	 * 
	 * @param message 로그 메시지
	 */
	public void i(String message)
	{
		if(checkLevel(INFO))
		{
			Log.i(mTag, message);
		}
	}
	
	/**
	 * WARNING 로그를 남긴다.
	 * 
	 * @param message 로그 메시지
	 */
	public void w(String message)
	{
		if(checkLevel(WARNING))
		{
			Log.w(mTag, message);
		}
	}
	
	/**
	 * ERROR 로그를 남긴다.
	 * 
	 * @param message 로그 메시지
	 */
	public void e(String message)
	{
		if(checkLevel(ERROR))
		{
			Log.e(mTag, message);
		}
	}
	
	/**
	 * 로깅이 가능한지 로그 레벨을 확인한다.
	 * 
	 * @param level 로그 레벨
	 * @return 로깅 허용 여부
	 */
	public boolean checkLevel(int level)
	{
		// 설정된 로그 레벨의 값이 없을 경우 설정에서 읽어온다.
		if(mLevel == 0)
		{
			String logLevel = BaseApplication.getConfigPersistent("logLevel");
			if(logLevel != null)
			{
				mLevel = Integer.parseInt(logLevel);
			}
			else
			{
				mLevel = 1;
			}
		}
		

		// 로그 레벨과 비교를 하여 설정값보다 높은 레벨만을 출력한다. 5의 경우에는 출력하지 않는다.
		if(mLevel <= level)
		{
			return true;
		}
		else
		{
			return false;
		}
	}
}
